<?php


namespace App\Helpers\Redis;


use App\Helpers\Helper;
use Illuminate\Support\Facades\Redis;

/**
 * Redis助手类基类
 *
 * Class BaseRedisHelper
 *
 * @package App\Helpers\Redis
 * @author  kingsg
 */
class BaseRedisHelper extends Helper
{
	public static $selectDb;    // 选择db
	public static $oldDb = null;    // 旧的的db： 用来暂存切换之前的db
	public static $nowDb = null;    // 当前的db： 用来暂存当前的db

	public static $clearWrapKey = false; // 清除包装的前缀，如果是true 表示没有前缀

	/**
	 * 前置处理
	 *
	 * @param $key
	 */
	protected static function beforeHandler(&$key)
	{
		// 设置前缀
		if (static::$clearWrapKey === false) {
			static::wrapKey($key);
		}
	}

	/**
	 * 清除包装的前缀
	 * $clearWrapKey:
	 *        true:表示没有前缀
	 *        false:表示有前缀
	 */
	public static function clearWrapKey(bool $clear = true)
	{
		if ($clear === true) {
			static::$clearWrapKey = true;
		} else {
			static::$clearWrapKey = false;
		}
	}

	/**
	 * 给Key包装前缀
	 *
	 * @param string $key
	 */
	private static function wrapKey(string &$key)
	{
		$key = env('CACHE_PREFIX', 'cache') . ':' . $key;
	}

	/**
	 * 选择DB
	 *
	 * @tips  请仔细阅读代码
	 *
	 * @param int  $index db序号0-15
	 * @param bool $force 是否强制切换db
	 */
	public static function selectDb(int $index, bool $force = false)
	{
		if (static::$oldDb === null) {
			// 通过配置获取初始db
			static::$nowDb = env('REDIS_DB', 0);
		}

		if ($force === true) {
			// 强制切换DB
			static::_selectDb($index);
		} else {
			// 非强制切换DB: 如果没有存在切换的DB状态，则切换，有则复用
			if (!static::$selectDb) {
				static::_selectDb($index);
			}
		}
	}

	/**
	 * 选择DB
	 *
	 * @param int $index db序号0-15
	 */
	private static function _selectDb(int $index)
	{
		// 切换db
		Redis::select($index);
		// 存储原来的db
		static::$oldDb = static::$nowDb;
		// 存储当前的db
		static::$nowDb = $index;
		// 标记db切换状态
		static::$selectDb = true;
	}

	/**
	 * 恢复默认DB
	 */
	public static function recoverDefaultDb()
	{
		if (static::$oldDb !== null) {
			Redis::select(static::$oldDb);
			// 取出原来的db
			$nowDb = static::$oldDb;
			// 存储当前的db
			static::$oldDb = static::$nowDb;
			// 存储原来的db
			static::$nowDb = $nowDb;
			// 标记db切换状态
			static::$selectDb = false;
		}
	}
}
